package com.hys.ultrasound.data.http;

import android.text.TextUtils;

import com.blankj.utilcode.util.SPUtils;
import com.hys.ultrasound.data.entity.AppVersion;
import com.hys.ultrasound.data.entity.Goods;
import com.hys.ultrasound.data.entity.Token;
import com.hys.ultrasound.data.entity.UserInfo;
import com.lpjeremy.libmodule.http.HttpPresenter;
import com.lpjeremy.libmodule.http.RetrofitUtil;
import com.lpjeremy.libmodule.http.callback.HttpRequestCallBack;
import com.lpjeremy.libmodule.http.exception.ApiException;
import com.lpjeremy.libmodule.http.model.BaseResult;

import java.util.List;

import io.reactivex.Observable;

/**
 * @desc:网络请求类
 * @date:2019/1/27 15:29
 * @auther:lp
 * @version:1.0
 */
public class HttpRequest extends HttpPresenter {
    public static HttpRequest getInstance() {
        return HttpRequestHolder.mInstance;
    }

    private static class HttpRequestHolder {
        private static final HttpRequest mInstance = new HttpRequest();
    }

    /**
     * 创建网络请求接口的实例
     */
    private ServerApi mServerApi;

    /**
     * 无需token的请求实例
     */
    private ServerApi mNoTokenServerApi;

    private HttpRequest() {
//        mServerApi = createServerApi();
    }

    /**
     * @param tapeToken 是否包含token
     * @return
     */
    private ServerApi createServerApi(boolean tapeToken) {
        if (tapeToken) {
            return RetrofitUtil.getInstance().createTapeTokenRetrofit(ServerApi.class, HttpConfig.API_URL);
        } else {
            return RetrofitUtil.getInstance().createNoTokenRetrofit(ServerApi.class, HttpConfig.API_URL);
        }
    }

    private ServerApi getNoTokenServerApi() {
        if (mNoTokenServerApi == null) {
            mNoTokenServerApi = createServerApi(false);
        }
        return mNoTokenServerApi;
    }

    private ServerApi getServerApi() {
        if (mServerApi == null) {
            mServerApi = createServerApi(true);
        }
        return mServerApi;
    }

    /**
     * 登录，get
     */
    public void login(String userName, String password, HttpRequestCallBack<UserInfo> callBack) {
        Observable<BaseResult<UserInfo>> observable = getNoTokenServerApi().login(userName, password);
        execute(observable, callBack);
    }
    /**
     * 刷新token
     */
    public void refreshToken(String refreshToken, HttpRequestCallBack<Token> callBack) {
        Observable<BaseResult<Token>> observable = getNoTokenServerApi().refreshToken(refreshToken);
        execute(observable, callBack);
    }

    /**
     * 检测升级
     */
    public void checkAppUpdate(String appVersion, HttpRequestCallBack<AppVersion> callBack) {
        Observable<BaseResult<AppVersion>> observable = getNoTokenServerApi().checkAppUpdate(appVersion);
        execute(observable, callBack);
    }

//    /**
//     * 根据拣货单号获取拣货详情
//     */
//    public void getJhdList(String appVersion, final HttpRequestCallBack<List<Goods>> callBack) {
//        final Observable<BaseResult<List<Goods>>> observable = getServerApi().getJhdList(appVersion);
//        execute(observable, new HttpRequestCallBack<List<Goods>>() {
//            @Override
//            public void onSuccess(List<Goods> result) {
//                callBack.onSuccess(result);
//            }
//
//            @Override
//            public void onFail(ApiException e) {
//                switch (e.getCode()) {
//                    case 401:
//                        String refreshToken = SPUtils.getInstance().getString("refreshToken");
//                        if (!TextUtils.isEmpty(refreshToken)) {
//                            refreshToken(refreshToken,new HttpRequestCallBack<Token>() {
//                                @Override
//                                public void onSuccess(Token result) {
//                                    SPUtils.getInstance().put("token", result.getAccess_token());
//                                    SPUtils.getInstance().put("refreshToken",result.getRefresh_token());
//                                    execute(observable, callBack);
//                                }
//
//                                @Override
//                                public void onFail(ApiException e) {
//                                    e.setMessage("账户信息失效，请重启APP重新登录");
//                                    callBack.onFail(e);
//                                }
//                            });
//                        }else{
//                            callBack.onFail(e);
//                        }
//                        break;
//                    default:
//                        callBack.onFail(e);
//                        break;
//                }
//            }
//        });
//    }

    /**
     * 获取批号
     */
    public void getPiHao(String spid, String tiaoma, final HttpRequestCallBack<String> callBack) {
        final Observable<BaseResult<String>> observable = getServerApi().getPiHao(spid, tiaoma);
        execute(observable, new HttpRequestCallBack<String>() {
            @Override
            public void onSuccess(String result) {
                callBack.onSuccess(result);
            }

            @Override
            public void onFail(ApiException e) {
                switch (e.getCode()) {
                    case 401:
                        String account = SPUtils.getInstance().getString("scanUserName");
                        String password = SPUtils.getInstance().getString("scanUserPwd");
                        if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(password)) {
                            login(account, password, new HttpRequestCallBack<UserInfo>() {
                                @Override
                                public void onSuccess(UserInfo result) {
                                    execute(observable, callBack);
                                }

                                @Override
                                public void onFail(ApiException e) {
                                    e.setMessage("账户信息失效，请重启APP重新登录");
                                    callBack.onFail(e);
                                }
                            });
                        }else{
                            callBack.onFail(e);
                        }
                        break;
                    default:
                        callBack.onFail(e);
                        break;
                }
            }
        });
    }

//    /**
//     * 保存数据
//     *
//     * @param list
//     * @param callBack
//     */
//    public void insert(List<Goods> list, final HttpRequestCallBack<String> callBack) {
//        final Observable<BaseResult<String>> observable = getServerApi().insert(list);
//        execute(observable, new HttpRequestCallBack<String>() {
//            @Override
//            public void onSuccess(String result) {
//                callBack.onSuccess(result);
//            }
//
//            @Override
//            public void onFail(ApiException e) {
//                switch (e.getCode()) {
//                    case 401:
//                        String refreshToken = SPUtils.getInstance().getString("refreshToken");
//                        if (!TextUtils.isEmpty(refreshToken)) {
//                            refreshToken(refreshToken,new HttpRequestCallBack<Token>() {
//                                @Override
//                                public void onSuccess(Token result) {
//                                    SPUtils.getInstance().put("token", result.getAccess_token());
//                                    SPUtils.getInstance().put("refreshToken",result.getRefresh_token());
//                                    execute(observable, callBack);
//                                }
//
//                                @Override
//                                public void onFail(ApiException e) {
//                                    e.setMessage("账户信息失效，请重启APP重新登录");
//                                    callBack.onFail(e);
//                                }
//                            });
//                        }else{
//                            callBack.onFail(e);
//                        }
//                        break;
//                    default:
//                        callBack.onFail(e);
//                        break;
//                }
//            }
//        });
//    }

//    /**
//     * 保存密码
//     *
//     * @param password
//     * @param callBack
//     */
//    public void validatePassword(String password, final HttpRequestCallBack<String> callBack) {
//        final Observable<BaseResult<String>> observable = getServerApi().validatePassword(password);
//        execute(observable, new HttpRequestCallBack<String>() {
//            @Override
//            public void onSuccess(String result) {
//                callBack.onSuccess(result);
//            }
//
//            @Override
//            public void onFail(ApiException e) {
//                switch (e.getCode()) {
//                    case 401:
//                        String refreshToken = SPUtils.getInstance().getString("refreshToken");
//                        if (!TextUtils.isEmpty(refreshToken)) {
//                            refreshToken(refreshToken,new HttpRequestCallBack<Token>() {
//                                @Override
//                                public void onSuccess(Token result) {
//                                    SPUtils.getInstance().put("token", result.getAccess_token());
//                                    SPUtils.getInstance().put("refreshToken",result.getRefresh_token());
//                                    execute(observable, callBack);
//                                }
//
//                                @Override
//                                public void onFail(ApiException e) {
//                                    e.setMessage("账户信息失效，请重启APP重新登录");
//                                    callBack.onFail(e);
//                                }
//                            });
//                        }else{
//                            callBack.onFail(e);
//                        }
//                        break;
//                    default:
//                        callBack.onFail(e);
//                        break;
//                }
//            }
//        });
//    }
//
//    /**
//     * 获取批号
//     */
//    public void getWareHouse(String key,  final HttpRequestCallBack<List<WareHouse>> callBack) {
//        final Observable<BaseResult<List<WareHouse>>> observable = getServerApi().getWareHouse(key);
//        execute(observable, new HttpRequestCallBack<List<WareHouse>>() {
//            @Override
//            public void onSuccess(List<WareHouse> result) {
//                callBack.onSuccess(result);
//            }
//
//            @Override
//            public void onFail(ApiException e) {
//                switch (e.getCode()) {
//                    case 401:
//                        String refreshToken = SPUtils.getInstance().getString("refreshToken");
//                        if (!TextUtils.isEmpty(refreshToken)) {
//                            refreshToken(refreshToken,new HttpRequestCallBack<Token>() {
//                                @Override
//                                public void onSuccess(Token result) {
//                                    SPUtils.getInstance().put("token", result.getAccess_token());
//                                    SPUtils.getInstance().put("refreshToken",result.getRefresh_token());
//                                    execute(observable, callBack);
//                                }
//
//                                @Override
//                                public void onFail(ApiException e) {
//                                    e.setMessage("账户信息失效，请重启APP重新登录");
//                                    callBack.onFail(e);
//                                }
//                            });
//                        }else{
//                            callBack.onFail(e);
//                        }
//                        break;
//                    default:
//                        callBack.onFail(e);
//                        break;
//                }
//            }
//        });
//    }
//
//    /**
//     * 获取批号
//     */
//    public void getGoodsInfoByCode(String code,  final HttpRequestCallBack<List<PGoods>> callBack) {
//        final Observable<BaseResult<List<PGoods>>> observable = getServerApi().getGoodsInfoByCode(code);
//        execute(observable, new HttpRequestCallBack<List<PGoods>>() {
//            @Override
//            public void onSuccess(List<PGoods> result) {
//                callBack.onSuccess(result);
//            }
//
//            @Override
//            public void onFail(ApiException e) {
//                switch (e.getCode()) {
//                    case 401:
//                        String refreshToken = SPUtils.getInstance().getString("refreshToken");
//                        if (!TextUtils.isEmpty(refreshToken)) {
//                            refreshToken(refreshToken,new HttpRequestCallBack<Token>() {
//                                @Override
//                                public void onSuccess(Token result) {
//                                    SPUtils.getInstance().put("token", result.getAccess_token());
//                                    SPUtils.getInstance().put("refreshToken",result.getRefresh_token());
//                                    execute(observable, callBack);
//                                }
//
//                                @Override
//                                public void onFail(ApiException e) {
//                                    e.setMessage("账户信息失效，请重启APP重新登录");
//                                    callBack.onFail(e);
//                                }
//                            });
//                        }else{
//                            callBack.onFail(e);
//                        }
//                        break;
//                    default:
//                        callBack.onFail(e);
//                        break;
//                }
//            }
//        });
//    }
//    /**
//     * 保存盘点数据
//     *
//     * @param list
//     * @param callBack
//     */
//    public void savePdData(List<PGoods> list, final HttpRequestCallBack<String> callBack) {
//        final Observable<BaseResult<String>> observable = getServerApi().savePdd(list);
//        execute(observable, new HttpRequestCallBack<String>() {
//            @Override
//            public void onSuccess(String result) {
//                callBack.onSuccess(result);
//            }
//
//            @Override
//            public void onFail(ApiException e) {
//                switch (e.getCode()) {
//                    case 401:
//                        String refreshToken = SPUtils.getInstance().getString("refreshToken");
//                        if (!TextUtils.isEmpty(refreshToken)) {
//                            refreshToken(refreshToken,new HttpRequestCallBack<Token>() {
//                                @Override
//                                public void onSuccess(Token result) {
//                                    SPUtils.getInstance().put("token", result.getAccess_token());
//                                    SPUtils.getInstance().put("refreshToken",result.getRefresh_token());
//                                    execute(observable, callBack);
//                                }
//
//                                @Override
//                                public void onFail(ApiException e) {
//                                    e.setMessage("账户信息失效，请重启APP重新登录");
//                                    callBack.onFail(e);
//                                }
//                            });
//                        }else{
//                            callBack.onFail(e);
//                        }
//                        break;
//                    default:
//                        callBack.onFail(e);
//                        break;
//                }
//            }
//        });
//    }


}
